package bancosys.tec.security.authorization;

/**
 * Permissão abstrata, define os métodos másicos, deixando para as especializações o contrutor
 * com a atribuição do tipo e id, o match do id e métodos específicos.
 * @created 25/03/2008
 * @author Gustavo Almeida
 */
public abstract class AbstractPermission implements Permission {
    protected String id;

    protected Class<? extends Permission> type;

    protected Long systemId;

    /**
     * see {@link Permission#getPermissionId()}
     * @return see {@link Permission#getPermissionId()}
     */
    public String getPermissionId() {
        return this.id;
    }

    /**
     * see {@link Permission#getType()}
     * @return see {@link Permission#getType()}
     */
    public Class<? extends Permission> getType() {
        return this.type;
    }

    /**
     * Testa a permissao comparando o type e delegando o "match" do permissionId para o método abstrato {@link AbstractPermission#matchPermissionId(String)}
     * @param permissionType tipo da permissão.
     * @param permissionId id da permissão
     * @return {@link Permission#match(Class, String)}
     */
    public boolean match(Class<? extends Permission> permissionType, String permissionId) {
        return (this.type.equals(permissionType) && this.matchPermissionId(permissionId));
    }

    /**
     * Devolve o id do sistema.
     * @return o id do sistema.
     */
    public Long getSystemId() {
        return systemId;
    }

    /**
     * Define o systemId.
     * @param systemId O systemId a ser definido.
     */
    public void setSystemId(Long systemId) {
        this.systemId = systemId;
    }

    /**
     * Testa um id contra o id dessa instância.
     * @param permissionId id.
     * @return devolve <code>true</code> se o id dessa instância fizer "match" no id passado como parametro, <code>false</code> caso contrário.
     */
    protected abstract boolean matchPermissionId(String permissionId);
}
